package ratelimit

import (
	"context"
	"fmt"
	"gitee.com/DonHz/basic-go/webook/internal/service/sms"
	"gitee.com/DonHz/basic-go/webook/pkg/ratelimit"
)

var errLimited = fmt.Errorf("触发了限流")

type RatelimitSMSService struct {
	// 装饰器模式，装饰这个接口
	svc sms.Service
	limiter ratelimit.Limiter
}

func NewRatelimitSMSService(svc sms.Service,limiter ratelimit.Limiter) sms.Service {
	return &RatelimitSMSService{
		svc: svc,
		limiter: limiter,
	}
}

func (s RatelimitSMSService) Send(ctx context.Context, tpl string, args []string, numbers ...string) error {
	ok, err:=s.limiter.Limit(ctx, "sms_tencent")
	if err!=nil{
		//系统错误
		// 可以限流或不限
		// 如果下游很坑，要限流，如果下游很强，业务可用性要求高，不限。
		return fmt.Errorf("短信服务判断是否限流出问题：%w", err)
	}
	if ok {
		return errLimited
	}
	// 核心业务 Send，在前后可以加新的功能
	err=s.svc.Send(ctx, tpl, args, numbers...)
	return err
}

